package com.cskaoyan.javase.oop3._1interface._1basic;

/**
 * 自此，我们已经引入了接口的概念。接下来，我们重点来研究一个接口的特点和使用。
 * 它的定义语法如下：
 * [访问权限修饰符] interface 接口名{}
 *
 * 接口的特点我们主要研究以下方面
 *      1.接口的声明特点
 *          接口的声明列表中,隐含了关键字"abstract"
 *          接口也是抽象的,接口也不能被new对象
 *          注意,该修饰符是默认的,隐含的,不要写出来
 *
 *      2.接口的实现类的书写格式
 *          有一些程序员,为了体现某个类是接口的实现类
 *          会以"接口名+Impl"的形式,命名接口的实现类
 *          如果接口比较多,还会新建一个"impl"包
 *
 *      3.接口的成员特点(接口中能够定义哪些节奏)
 *          接口不是类,它能够定义的结构和类完全不同
 *          能不能定义变量?
 *              实际上接口当中允许定义的变量
 *                  全部都是默认被"public static final"修饰的公共的全局常量
 *                  注意:
 *                  a.这些默认的修饰符没必要写出来
 *                  b.接口中允许定义的所有结构的访问权限修饰符,必须是public,也默认是public
 *                      不可以被更改
 *                  c.接口表示对功能的扩展,接口中几乎不会定义全局常量,定义它也没有太大意义
 *                      tips:
 *                      除非接口的所有实现类,都需要一个全局常量,那么可以考虑把这个全局常量放在接口中.
 *
 *          能不能定义方法?
 *              可以定义,但是接口中的所有方法默认都是被"public abstract"修饰的公共抽象方法
 *              同样的,隐含的修饰符不要写出来
 *              并且由于接口表示功能扩展,绝大多数情况下,接口的定义都很简单,只有抽象方法.
 *
 *              注意:
 *              在Java8当中,接口不再全部都是抽象方法了,接口中允许定义默认实现方法和静态实现方法.
 *
 *          构造器
 *              接口不能new对象,那么接口有构造吗?
 *              接口中没有构造器,因为没有任何地方需要用构造器赋值
 *              接口中全部都是全局常量
 *
 *          代码块
 *              既然没有构造器,就没有构造代码块
 *              而且也没有静态代码块,接口中的全局常量,必须显式赋值
 *
 * 以上就是接口的自身特点,下面来浅谈一下接口的子类/实现类的特点:
 * 接口的子类/实现类可以是:
 *      1.普通类,必须实现所有的抽象方法
 *      2.抽象类,不需要实现,当然可以选择实现
 * 接口的子类除了可以是一个class外,还可以也是一个接口,称之为"接口的继承"
 *      接口如果被继承,那么允许多继承,一个接口,可以同时继承多个接口
 *
 * 以上总结一下,接口/普通类/抽象类,它们之间的继承extends以及实现implements关心:
 *      1.继承extends是不能跨越种族的,类和类继承,接口和接口继承
 *          类的继承是单继承的
 *          接口的继承是多继承
 *          但不管是什么继承,继承中的子类一定会得到父类的成员'
 *
 *      2.实现implements仅用于类实现接口
 *          普通类实现接口需要实现抽象方法
 *          抽象类实现接口无需实现,但可以选择实现
 *
 *      3.接口和类之间没有直接关系
 *          不能继承,更不能实现
 *
 * @since 17:21
 * @author wuguidong@cskaoyan.onaliyun.com
 */

public interface IDemo {
    // Variable 'a' might not have been initialized
    // public static final int a = 10;

    // 在接口中定义全局常量,应该省略修饰符,按照以下方式定义
    int A = 10;
    String NAME = "张三";

    // {}
    // static {}
    // Interface abstract methods cannot have body
    // public void test(){
    // }

    // 接口中按以下方式定义方法
    void test();

    void test2();

    int test3();

}


// 一般来说,大家开发中见到的接口,都是如下形式
interface IA {
    void test();

    int test2();

    String test3(int num);

}

interface IB extends IA,IC,ID{

}
interface IC{
    void test4();
}
interface ID{
    void test5();
}

class IBImpl implements IB{
    @Override
    public void test() {

    }

    @Override
    public int test2() {
        return 0;
    }

    @Override
    public String test3(int num) {
        return null;
    }

    @Override
    public void test4() {

    }

    @Override
    public void test5() {

    }
}


// Modifier 'abstract' is redundant for interfaces
// public abstract interface IDemo {
// }
